Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - [Algoritmo] Algoritmo per il filtraggio di cordinate
Forum - Algoritmi - [Algoritmo] Algoritmo per il filtraggio di cordinate

Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 16:30
Venerdì, 19/09/2014
CIAO :d

Ho costruito in vb.net un selecter, che si occupa per la selezione, deselezione e la verifica di cordinate selezionate

Ho implementato selecter combinando una griglia(X,Y) e List(point)

Devo creare una funzione che mi restituisce un array(vettori) di punti appartenenti a un rettangolo passato come argomento.
Es ho una griglia di 4x4 di punti selezionati o no
1001
0101
0010
1011
lista di punti selezionati:
[0,0]
[3,0]
[1,1]
[3,1]
[2,2]
[0,3]
[2,3]
[3,3]
(i punti 1 sono quelli selezionati e quelli 0 no)
Il problema è come selezionare i punti all' interno es del rettangolo [1,1] con dimensioni 2,2. Mi deve restituire [1,1] e [2,2].

Devo scegliere il miglior algoritmo (più veloce). 2 possibili algoritmi sono
Codice sorgente - presumibilmente Plain Text

  1. FUNZIONE getPuntiSelezionatiInRettangolo(sel, rett) punto[]
  2.    //Dichiara la lista dei punti
  3.    punti[]
  4.    //controlla ogni punto appartenente al rettangolo
  5.    per x = rett.x a rett.x + rett.width - 1
  6.       per y = rett.y a rett.y + rett.height - 1
  7.          //verifica se è selezionato
  8.          se (sel.isSelected(x,y)) allora punti.aggiungi(new punto(x,y))
  9.      fine per
  10.    fine per
  11.    restituisce punti
  12. FINE FUNZIONE



Questo algoritmo funziona ciclando x e y e verificando ogni punto se è selezionato

Invece questo cicla la lista
Codice sorgente - presumibilmente Algoritmi

  1. FUNZIONE getPuntiSelezionatiInRettangolo(sel, rett) punto[]
  2.    //Dichiara la lista dei punti
  3.    punti[]
  4.    //controlla ogni punto selezionato
  5.    per ogni p in sel.getPuntiSelezionati()
  6.       //verifica se appartiene al rettangolo
  7.       se rett.intersecaPunto(p) allora punti.aggiungi(p)
  8.    fine per
  9.    restituisci punti
  10. FINE FUNZIONE




entrambi hanno i pro e contro:
PRO per il primo: il massimo tempo è rett.width*rett.height,però se non c'è nessun punto selezionato, la funzione in pratica fa pardere tempo
PRO per il secondo: se la lista è abbastanza corta(< rett.width*rett.height) può essere conveniente, ma se è lunghissima(per esempio 1000 item) può impiegarci un sacco di tempo per la ricerca.

L'idea che mi è appena venuto in mente è quello di verificare la dimensione della lista e l'area del rettangolo, scegliendo il primo algoritmo se l'area è minore, altrimenti l'altro




PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 18:23
Venerdì, 19/09/2014
I punti sono dati tramite un input del tipo "mappa"
Codice sorgente - presumibilmente Plain Text

  1. 1001
  2. 0101
  3. 0010
  4. 1011



oppure del tipo "elenco di coordinate"?
Codice sorgente - presumibilmente Plain Text

  1. [0,0]
  2. [3,0]
  3. [1,1]
  4. [3,1]
  5. [2,2]
  6. [0,3]
  7. [2,3]
  8. [3,3]



Lo chiedo perché l'algoritmo 1 (quella che cicla su x e y) va bene se l'input è del tipo "mappa". Infatti conoscendo le coordinate del rettangolo vai subito a vedere i punti che ti interessano e ignori i restanti.

Invece se l'input è come "l' elenco di coordinate" conviene il secondo algoritmo in quanto in ogni caso dovrai leggere per forza tutto il file (altrimenti rischi di perderti qualche punto) e di verificare per ogni riga se il punto è compreso o meno nel rettangolo.

Spero di essere stato chiaro :)

Ho cercato soluzioni alternative ma non me ne sono venute in mente. Sono curioso di vedere le idee degli altri :)

PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 18:30
Venerdì, 19/09/2014
entrambi. nella reale implementazione la mappa è di tipo linkedListNode(of point)()() che puntano alla lista linkedList(of point). Ho usate entrambe le strutture per migliore le operazioni.
Per es, per selezionare un punto, se uso la mappa è O(1), invece la lista O(n), altri es se uso getPuntiSelezionati() (nome nel codice GetSelections()), se uso la mappa è O(n), invece la lista O(1).

PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 18:31
Venerdì, 19/09/2014
Quando uso select mi crea un nuovo nodo della linkedList e la aggiunge alla lista, poi copia il link alla mappa.

PM Quote